package site.marqstree.latte.ui.recycler;

import androidx.annotation.Nullable;

import com.chad.library.adapter.base.entity.MultiItemEntity;

import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.util.LinkedHashMap;

/*
 * 项目名: EleCommerce
 * 包名: site.marqstree.latte.ui.recycler
 * 文件名: MultipleItemEntity
 * 创建者: marqstree
 * 创建时间: 2020/1/22 16:07
 * 描述: View Model类，代表RecyclerView中的一个Item对应的数据对象，供BaseRecyclerViewAdapterHelper使用
 * View Model中包含
 * 1）可见的与UI绑定的业务数据字段，如：
 *
 */
public class MultipleItemEntity implements MultiItemEntity {
    //软引用队列
    //作用：通过软引用队列，可查询那些对象已被释放
    private final ReferenceQueue<LinkedHashMap<Object, Object>> ITEM_QUEUE = new ReferenceQueue<>();
    //Item中的业务字段和管理字段存入有序Map(LinkedHashMap)中
    private final LinkedHashMap<Object, Object> MULTIPLE_FIELDS = new LinkedHashMap<>();
    //创建字段Map的软引用
    //软引用优点：内存不足时，jvm释放软引用对象内存
    private final SoftReference<LinkedHashMap<Object, Object>> FIELDS_REFERENCE =
            new SoftReference<>(MULTIPLE_FIELDS, ITEM_QUEUE);

    //写入所有字段
    MultipleItemEntity(LinkedHashMap<Object, Object> fields) {
        FIELDS_REFERENCE.get().putAll(fields);
    }

    //获取View model构造器
    public static MultipleEntityBuilder builder(){
        return new MultipleEntityBuilder();
    }

    //获取View model的数据类型
    @Override
    public int getItemType() {
        int t = (int) FIELDS_REFERENCE.get().get(MultipleFields.ITEM_TYPE);
        return t;
    }

    //获取某View Model中某一字段的值
    @SuppressWarnings("unchecked")
    public final <T> T getField(Object key){
        return (T) FIELDS_REFERENCE.get().get(key);
    }

    //获取所有字段的Map
    public final LinkedHashMap<?,?> getFields(){
        return FIELDS_REFERENCE.get();
    }

    //写入某一个字段
    public final MultipleItemEntity setField(Object key,Object value){
        FIELDS_REFERENCE.get().put(key,value);
        return this;
    }

}
